接續前一篇 [Reply] 你該知道的Unix的工具:lsof (一) 未完成的內容。
以程式名稱為範圍,找所有開啟的檔
# lsof -c apache
-c的參數,列出程序中所開啟的檔名是以apache開頭的列表。
所以原來用這樣的方式列出:
#lsof | grep foo
可以縮短成:
#lsof -c foo
實際上,可以只寫檔案的部份名稱:
# lsof -c apa
就會列出所有被程序開啟檔案裡檔名以apa開頭的列表。
也可同時用好幾個-c參數使用:
# lsof -c apache -c python
就會列出被apache及python所開啟的檔案列表。
列出使用者 或 程序所開啟的檔案
# lsof -u pkrumins -c apache
lsof 的各參數可互相結合,
預設互相是用 OR 的方式結合,
就是會把 -u pkrumins 和 -c apache 的兩輸出結果,
共同地列出來。
列出使用者 且 程序所開啟的檔案
# lsof -a -u pkrumins -c bash
這裡用 -a 參數,
列出是使用者 pkrumins 身分下,
以 bash 程序所開啟的檔案的列表。
列出 除了 root之外所有使用者所開啟的檔案
# lsof -u ^root
root之前的 ^ 符號,就是指出只要不是 root身分的,
都列出所開啟的檔案列表。
列出所有某PID程序所開啟的檔案
# lsof -p 1
-p 是過濾出被某程序ID所開啟的檔案。
也可以同時指定多個PID,藉著逗號分隔:
# lsof -p 450,980,333
列出PID是 450,980,333 的程序所開的檔案。
列出所有 除了某PID程序 所開啟的檔案
# lsof -p ^1
列出不包含 PID為1 的其他PID程序所開的檔案。
列出所有網路連結
#lsof -i
-i 列出所有開啟internet socket的程序。
列出所有TCP的網路連結
#lsof -i tcp
-i 後可以有幾個選項,其中之一為tcp,
在此只列出使用 TCP socket 的程序。
列出所有UDP的網路連結
#lsof -i udp
udp 的選項可列出用UDP socket的程序。
找出用某連接埠的程序
# lsof -i :25
:25 的選項列出用TCP或UDP的25連結埠的程序。
也可用/etc/services所定義的埠號名稱來取代埠號數字:
# lsof -i :smtp
找出用某UDP埠號的程序
# lsof -i udp:53
同樣地也可用在TCP連接埠:
# lsof -i tcp:80
找出某使用者所有網路活動的程序
# lsof -a -u hacker -i
-a 是把 -u -a 用「且」的方式連結,
找出使用者hacker身分跑的相關網路程序所開啟的檔案。
列出所有NFS的檔案
# lsof -N
-N 是指 NFS
列出所有Unix domain socket檔案
# lsof -U
-U 是指 Unix
列出某群組程序所開的檔案
# lsof -g 1234
列出 PGID 為1234開啟的檔案。
列出所指定的檔案描述所開啟的檔案
# lsof -d 2
列出以檔案描述為2的被開啟檔案。
也可用範圍的方式來指定:
# lsof -d 0-2
列出檔案描述為0,1,2的檔案。
也可用其他的值來指定,像mem列出記憶體對應:
# lsof -d mem
或用 txt 列出載入記憶體及執行的程式:
# lsof -d txt
輸出用某資源程序的PID
# lsof -t -i
-t 選項是只輸出程序的PID。
再加上-i,則是指有關網路連結,
所以很容易地來殺掉所有用網路的程序:
# kill -9 lsof -t -i
重覆執行列出檔案
-r 的選項讓lsof重覆地列出檔案,
直到被中。
而參數 1 是指每隔一秒重列一次。
這種用法最好的使用情況是,
監看某使用者連網路會用到檔案的情形:
# lsof -r 1 -u john -i -a
如何安裝lsof?
在許多Unix系統,
大部份已預設安裝。
如果沒有的話,
可抓 原始檔 自已編譯使用。
BSD 有類似功能的工具叫 fstat。
詳細說明可參看 man lsof,
或鍵入 lsof -h 查看。
本文簡譯自 A Unix Utility You Should Know About: lsof
系列文章